МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет Львівська політехніка
Кафедра ПЗ
До лабораторної роботи № 2
З курсу “Чисельні методи”
На тему:
“ Розв’язування системи лінійних рівнянь ”.
Виконав:
Студент групи КН-3
Львів – 2008
Тема:
Розв’язування системи лінійних рівнянь.
Мета:
Оволодіти засобами розв’язування системи лінійних рівнянь за допомогою різних методів .
Знайти розв’язок системи лінійних рівнянь з точністю до 10-3 методом Гаусса та методом LU-розкладу, порівняти результати, а також обчислити детермінант матриці коефіцієнтів та обернену до неї матрицю.
Варіанти завдань:
В процесі розроблення лабораторної роботи було розроблено наступний програмний продукт:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
float *Gaus(float[3][4]);
float *LU(float[3][3]);
float *Iter(float[3][4], float);
float det(float[3][3]);
float *matr(float[3][4]);
float A[3][3] = {{0.34, 0.71, 0.63},
{0.71, -0.65, -0.18},
{1.17, -2.35, 0.75} };
float B[] = {2.08,
0.17,
1.28 };
float AB[3][4] = {0.34, 0.71, 0.63, 2.08,
0.71, -0.65, -0.18, 0.17,
1.17, -2.35, 0.75, 1.28 };
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
/*float *Gaus(float AB[3][4])
{
float result[3], t1, t2;
int i, j;
t1 = AB[0][0];
for(i=0; i<4; i++)
AB[0][i] = AB[0][i]/t1;
t1 = AB[1][0];
t2 = AB[2][0];
for(i=0; i<4; i++)
{
AB[1][i] = AB[1][i] - AB[0][i]*t1;
AB[2][i] = AB[2][i] - AB[0][i]*t2;
}
t1 = AB[1][1];
for(i=0; i<4; i++)
AB[1][i] = AB[1][i]/t1;
t1 = AB[2][1];
for(i=0; i<4; i++)
AB[2][i] = AB[2][i] - AB[1][i]*t1;
result[2] = AB[2][3]/AB[2][2];
result[1] = AB[1][3] - AB[1][2]*result[2];
result[0] = AB[0][3] - AB[0][2]*result[2] - AB[0][1]*result[1];
return result;
} */
float *Gaus(float a[3][4])
{
const n = 3;
int l, i, k;
float c, s;
// float a[n][m];
float x[n];
/* for(i=0; i<n; i++)
for(k=0; k<m; k++)
scanf("%f", &a[i][k]);*/
for(l=0; l<n-1; l++)
{
c = a[l][l];
for(k=l+1; k<n+1; k++)
{
a[l][k] = -a[l][k]/c;
for(i=l+1; i<n; i++) a[i][k] = a[i][k] + a[i][l]*a[l][k];
}
}
x[n-1] = a[n-1][n]/a[n-1][n-1];
for(i=n-2; i>=0; i--)
{
s =- a[i][n];
for(k=i+1; k<n; k++) s = s + a[i][k]*x[k];
x[i] = s;
}
return x;
}
float *LU(float A[3][3])
{
const N=3;
float L[N][N];
float U[N][N];
int i, j, k;
float temp;
float result[3];
for(i=0; i<N; i++) U[0][i] = A[0][i];
if(U[0][0] == 0) return NULL;
for(i=1; i<N; i++) L[i][0] = A[i][0] / A[0][0];
for(i=1; i<N; i++)
{
for(j=0; j<N; j++)
{
if(j < i)U[i][j] = 0.0;
else
{
temp = 0.0;
for(k = 0; k < i; k++) temp += L[i][k] * U[k][j];
U[i][j] = A[i][j] - temp;
}
}
for(j = 0; j < N; j++)
{
if(j < i + 1)
{
if(j == i)
{
L[j][i] = 1.0;
}
else
{
L[j][i] = 0.0;
}
}
else
{
temp = 0.0;
for(k = 0; k < i; k++)
{
temp += L[j][k] * U[k][i];
}
if(U[i][i] != 0)
{
L[j][i] = (1 / U[i][i]) * (A[j][i] - temp);
...